SĂŒgav sukeldumine JavaScripti Temporal Instant API-sse ĂŒlitĂ€psete ajaarvutuste jaoks, kattes loomise, manipuleerimise, vĂ”rdlemise ja kasutusjuhud.
JavaScripti Temporal Instant: ĂŒlitĂ€psed ajaarvutused
JavaScript on juba ammu tuntud oma mitte just ideaalsete kuupĂ€eva ja kellaaja kĂ€sitlemise vĂ”imekuste poolest. PĂ€randobjekt Date, kuigi laialdaselt kasutatud, kannatab muutlikkuse, ebajĂ€rjekindla API kĂ€itumise ja kehva ajavööndite toe all. Siin tuleb mĂ€ngu Temporal API, kaasaegne lĂ€henemine kuupĂ€eva ja kellaaja manipuleerimisele, mis on loodud nende puuduste lahendamiseks. Temporali sĂŒdames on objekt Instant, mis esindab kindlat ajahetke nanosekundi tĂ€psusega. See blogipostitus pakub pĂ”hjalikku juhendit Temporal.Instant kasutamiseks ĂŒlitĂ€psete ajaarvutuste tegemiseks teie JavaScripti rakendustes, arvestades globaalse publiku erinevaid vajadusi.
Mis on Temporal.Instant?
Temporal.Instant esindab ajahetke, mida mÔÔdetakse Unixi ajastu algusest (1. jaanuar 1970, kell 00:00:00 koordineeritud maailmaaeg (UTC)) nanosekundi tĂ€psusega. Erinevalt pĂ€randobjektist Date on Temporal.Instant muutumatu, mis tĂ€hendab, et selle vÀÀrtust ei saa pĂ€rast loomist muuta. See muutumatus on ĂŒlioluline ootamatute kĂ”rvalmĂ”jude vĂ€ltimiseks ja andmete terviklikkuse tagamiseks, eriti keerukates rakendustes.
Temporal.Instant objektide loomine
Temporal.Instant objekte saab luua mitmel viisil:
1. Arvust (millisekundid ajastu algusest)
Saate luua Instant objekti millisekundite arvust, mis on möödunud Unixi ajastu algusest. See sarnaneb pÀrandobjekti Date toimimisega, kuid Temporal.Instant pakub suuremat tÀpsust.
const instant = Temporal.Instant.fromEpochMilliseconds(1678886400000); // 15. mÀrts 2023, 00:00:00 UTC
console.log(instant.toString()); // VĂ€ljund: 2023-03-15T00:00:00Z
2. Arvust (nanosekundid ajastu algusest)
Veelgi suurema tÀpsuse saavutamiseks saate luua Instant objekti nanosekundite arvust, mis on möödunud Unixi ajastu algusest. See on kÔige tÀpsem viis ajahetke esitamiseks Temporal.Instant abil.
const instant = Temporal.Instant.fromEpochNanoseconds(1678886400000000000n); // 15. mÀrts 2023, 00:00:00 UTC
console.log(instant.toString()); // VĂ€ljund: 2023-03-15T00:00:00Z
Pange tĂ€hele n-lĂ”pu kasutamist, mis tĂ€histab BigInt-literaali. Nanosekundite vÀÀrtused ĂŒletavad sageli JavaScripti numbrite maksimaalset turvalist tĂ€isarvu vÀÀrtust, seega on BigInt-i kasutamine tĂ€psuse sĂ€ilitamiseks vajalik.
3. ISO 8601 stringist
Temporal.Instant saab luua ka ISO 8601 stringist, mis esindab UTC kuupÀeva ja kellaaega.
const instant = Temporal.Instant.from('2023-03-15T00:00:00Z');
console.log(instant.toString()); // VĂ€ljund: 2023-03-15T00:00:00Z
const instantWithFractionalSeconds = Temporal.Instant.from('2023-03-15T00:00:00.123456789Z');
console.log(instantWithFractionalSeconds.toString()); // VĂ€ljund: 2023-03-15T00:00:00.123456789Z
ISO 8601 string peab lĂ”ppema Z-ga, et tĂ€histada UTC-d. String vĂ”ib valikuliselt sisaldada sekundimurda kuni ĂŒheksa numbrikoha tĂ€psusega.
4. Temporal.Now abil (sĂŒsteemikell)
Praeguse ajahetke saate kÀtte, kasutades Temporal.Now.instant():
const now = Temporal.Now.instant();
console.log(now.toString()); // VÀljund: varieerub sÔltuvalt praegusest ajast
Töötamine Temporal.Instant objektidega
Kui teil on Temporal.Instant objekt, saate sellega teha erinevaid toiminguid. Pidage meeles, et Temporal.Instant objektid on muutumatud, seega tagastavad need toimingud uued Temporal.Instant objektid, mitte ei muuda algset.
1. Aja liitmine ja lahutamine
Saate Instant objektile aega lisada vÔi sellest aega lahutada, kasutades meetodeid add() ja subtract(). Need meetodid aktsepteerivad Temporal.Duration objekti, mis esindab ajavahemikku.
const instant = Temporal.Instant.from('2023-03-15T00:00:00Z');
const duration = Temporal.Duration.from({ hours: 2, minutes: 30 });
const futureInstant = instant.add(duration);
console.log(futureInstant.toString()); // VĂ€ljund: 2023-03-15T02:30:00Z
const pastInstant = instant.subtract(duration);
console.log(pastInstant.toString()); // VĂ€ljund: 2023-03-14T21:30:00Z
Saate kestuse jaoks kasutada ka string-esitust:
const instant = Temporal.Instant.from('2023-03-15T00:00:00Z');
const futureInstant = instant.add('PT2H30M'); // ISO 8601 kestuse string
console.log(futureInstant.toString()); // VĂ€ljund: 2023-03-15T02:30:00Z
2. Ajahetkede vÔrdlemine
Saate vÔrrelda kahte Temporal.Instant objekti, kasutades meetodit compare(). See meetod tagastab:
-1, kui esimene ajahetk on varasem kui teine.0, kui kaks ajahetke on vÔrdsed.1, kui esimene ajahetk on hilisem kui teine.
const instant1 = Temporal.Instant.from('2023-03-15T00:00:00Z');
const instant2 = Temporal.Instant.from('2023-03-15T01:00:00Z');
console.log(Temporal.Instant.compare(instant1, instant2)); // VĂ€ljund: -1
console.log(Temporal.Instant.compare(instant2, instant1)); // VĂ€ljund: 1
console.log(Temporal.Instant.compare(instant1, instant1)); // VĂ€ljund: 0
3. Teisendamine teisteks Temporal-tĂŒĂŒpideks
Temporal.Instant saab teisendada teisteks Temporal-tĂŒĂŒpideks, nĂ€iteks Temporal.ZonedDateTime, Temporal.PlainDateTime ja Temporal.PlainDate. See on oluline ajavööndite ning lokaliseeritud kuupĂ€eva ja kellaaja esitustega töötamisel.
a. Teisendamine Temporal.ZonedDateTime'iks
Temporal.ZonedDateTime esindab kuupÀeva ja kellaaega kindlas ajavööndis. Instant objekti teisendamiseks ZonedDateTime'iks peate mÀÀrama ajavööndi.
const instant = Temporal.Instant.from('2023-03-15T00:00:00Z');
const zonedDateTime = instant.toZonedDateTimeISO('America/Los_Angeles');
console.log(zonedDateTime.toString()); // VĂ€ljund: 2023-03-14T17:00:00-07:00[America/Los_Angeles]
Meetod toZonedDateTimeISO() loob ZonedDateTime objekti, kasutades ISO 8601 kalendrit. Erineva kalendri mÀÀramiseks saate kasutada ka meetodit toZonedDateTime().
b. Teisendamine Temporal.PlainDateTime'iks
Temporal.PlainDateTime esindab kuupÀeva ja kellaaega ilma ajavööndita. Instant objekti teisendamiseks PlainDateTime'iks peate selle esmalt teisendama ZonedDateTime'iks ja seejÀrel hankima sellest PlainDateTime objekti.
const instant = Temporal.Instant.from('2023-03-15T00:00:00Z');
const zonedDateTime = instant.toZonedDateTimeISO('America/Los_Angeles');
const plainDateTime = zonedDateTime.toPlainDateTime();
console.log(plainDateTime.toString()); // VĂ€ljund: 2023-03-14T17:00:00
c. Teisendamine Temporal.PlainDate'iks
Temporal.PlainDate esindab kuupÀeva ilma kellaaja vÔi ajavööndita. Sarnaselt PlainDateTime'iga teisendate esmalt ZonedDateTime'iks.
const instant = Temporal.Instant.from('2023-03-15T00:00:00Z');
const zonedDateTime = instant.toZonedDateTimeISO('America/Los_Angeles');
const plainDate = zonedDateTime.toPlainDate();
console.log(plainDate.toString()); // VĂ€ljund: 2023-03-14
4. Millisekundite ja nanosekundite hankimine ajastu algusest
Saate hankida Unixi ajastu algusest möödunud millisekundite vÔi nanosekundite arvu, kasutades vastavalt omadusi epochMilliseconds ja epochNanoseconds.
const instant = Temporal.Instant.from('2023-03-15T00:00:00.123456789Z');
console.log(instant.epochMilliseconds); // VĂ€ljund: 1678886400123
console.log(instant.epochNanoseconds); // VĂ€ljund: 1678886400123456789n
Temporal.Instant'i kasutusjuhud
Temporal.Instant on eriti kasulik stsenaariumides, kus on vaja ĂŒlitĂ€pseid ajaarvutusi. Siin on mĂ”ned nĂ€ited:
1. SĂŒndmuste logimine ja auditeerimine
SĂŒndmuste logimisel vĂ”i sĂŒsteemi tegevuse auditeerimisel on ĂŒlioluline tabada sĂŒndmuse toimumise tĂ€pne aeg. Temporal.Instant pakub vajalikku tĂ€psust ajatemplite korrektseks salvestamiseks.
function logEvent(eventDescription) {
const timestamp = Temporal.Now.instant().toString();
console.log(`[${timestamp}] ${eventDescription}`);
}
logEvent('Kasutaja logis sisse');
logEvent('Fail salvestatud');
2. JÔudluse mÔÔtmine
Koodi jÔudluse mÔÔtmine nÔuab tÀpset ajastust. Temporal.Instant abil saab mÔÔta koodiplokkide tÀitmisaega nanosekundi tÀpsusega.
const start = Temporal.Now.instant();
// MÔÔdetav kood
for (let i = 0; i < 1000000; i++) {
// Mingi operatsioon
}
const end = Temporal.Now.instant();
const duration = end.since(start);
console.log(`TĂ€itmisaeg: ${duration.total('milliseconds')} millisekundit`);
3. HajussĂŒsteemid ja andmete sĂŒnkroniseerimine
HajussĂŒsteemides nĂ”uab andmete jĂ€rjepidevuse sĂ€ilitamine mitme sĂ”lme vahel sageli tĂ€pset ajasĂŒnkroniseerimist. Temporal.Instant abil saab esitada andmeuuenduste ajatempleid ja lahendada konflikte aja pĂ”hjal.
NĂ€iteks kujutage ette stsenaariumi, kus andmeid replikeeritakse mitme serveri vahel erinevates geograafilistes asukohtades (nt sisuedastusvĂ”rk vĂ”i hajusandmebaas). Kui kasutaja uuendab kirjet, peab sĂŒsteem tagama, et viimane uuendus leviks jĂ€rjepidevalt kĂ”ikidesse serveritesse. Iga uuenduse ajatembeldamine Temporal.Instant abil tagab tĂ€pse jĂ€rjestuse, isegi vĂ”rgu latentsuse ja serverite vahelise vĂ”imaliku kella nihke korral.
4. Finantstehingud
Finantstehingud nĂ”uavad sageli ĂŒlitĂ€pseid ajatempleid regulatiivse vastavuse ja tĂ€pse arvestuse tagamiseks. Tehingu, makse vĂ”i ĂŒlekande tĂ€pne aeg tuleb tĂ€pselt salvestada, et vĂ€ltida vaidlusi ja tagada vastutus.
NĂ€iteks kĂ”rgsagedusliku kauplemise sĂŒsteemid nĂ”uavad mikrosekundi vĂ”i nanosekundi tĂ€psust, et tabada tellimuse tĂ€itmise tĂ€pne hetk. Isegi vĂ€ikesed ajastuse erinevused vĂ”ivad kaasa tuua olulisi rahalisi tagajĂ€rgi. Temporal.Instant pakub nende kriitiliste rakenduste jaoks vajalikku lahutusvĂ”imet.
5. Teaduslikud rakendused
Paljud teaduslikud rakendused, nagu astronoomia, fĂŒĂŒsikasimulatsioonid ja katsete andmete logimine, nĂ”uavad vĂ€ga tĂ€pseid ajamÔÔtmisi. Need mÔÔtmised on sageli ĂŒliolulised andmete analĂŒĂŒsimiseks ja tĂ€psete jĂ€relduste tegemiseks.
Kujutage ette teleskoopi, mis kogub andmeid kaugest tÀhest. Iga vaatluse tÀpne ajastus on oluline tÀhe asukoha, liikumise ja muude omaduste mÀÀramiseks. Temporal.Instant vÔimaldab teadlastel salvestada neid ajatempleid vajaliku tÀpsusega.
Rahvusvahelistamine ja ajavööndid
Kuigi Temporal.Instant esindab ajahetke UTC-s, on oluline arvestada ajavöönditega, kui töötate kuupÀevade ja kellaaegadega globaalsele publikule. Nagu varem nÀidatud, saate teisendada Instant objekti Temporal.ZonedDateTime'iks, et esindada sama ajahetke kindlas ajavööndis.
KuupĂ€evade ja kellaaegade kuvamisel kasutajatele kasutage alati nende kohalikku ajavööndit, et vĂ€ltida segadust. Saate kasutaja ajavööndi hankida tema brauserist vĂ”i operatsioonisĂŒsteemist. NĂ€iteks vĂ”ite kasutada Intl.DateTimeFormat API-d kuupĂ€eva ja kellaaja vormindamiseks vastavalt kasutaja lokaadile ja ajavööndile.
const instant = Temporal.Instant.from('2023-03-15T00:00:00Z');
const zonedDateTime = instant.toZonedDateTimeISO(Temporal.Now.timeZone());
const formatter = new Intl.DateTimeFormat(undefined, {
year: 'numeric',
month: 'long',
day: 'numeric',
hour: 'numeric',
minute: 'numeric',
timeZoneName: 'short',
});
console.log(formatter.format(zonedDateTime)); // VÀljund: varieerub sÔltuvalt kasutaja lokaadist ja ajavööndist
See nĂ€ide kasutab kasutaja sĂŒsteemi ajavööndit. Vajadusel saate asendada Temporal.Now.timeZone() konkreetse ajavööndi identifikaatoriga (nt 'America/Los_Angeles').
MĂ€rkus: Olge ajavöönditega töötades alati teadlik suveajast (DST). Ajavööndite reeglid vĂ”ivad muutuda, seega on oluline kasutada ajakohast ajavööndite andmebaasi, et tagada tĂ€psed arvutused. Temporal API kĂ€sitleb ajavööndite vahelisel teisendamisel suveajale ĂŒleminekuid automaatselt.
Brauseri- ja keskkonnatugi
2023. aasta lĂ”pu seisuga on Temporal API veel suhteliselt uus ja seda ei toetata veel tĂ€ielikult kĂ”ikides brauserites ja JavaScripti keskkondades. Vanemate brauserite toe pakkumiseks vĂ”ib olla vaja kasutada polĂŒfilli.
Pakk @js-temporal/polyfill pakub Temporal API jaoks polĂŒfilli. Saate selle installida npm-i vĂ”i yarn-i abil:
npm install @js-temporal/polyfill
SeejĂ€rel importige polĂŒfill oma JavaScripti koodi:
import '@js-temporal/polyfill';
See lisab Temporal API globaalsesse skoopi, vÔimaldades teil seda oma koodis kasutada ka siis, kui keskkond seda loomulikult ei toeta.
Parimad praktikad ja kaalutlused
- Kasutage sisemiseks salvestamiseks ja arvutusteks UTC-d: salvestage kÔik ajatemplid UTC-s, et vÀltida ajavöönditega seotud probleeme. Teisendage kohalikesse ajavöönditesse ainult siis, kui kuvate kasutajatele kuupÀevi ja kellaaegu.
- KÀsitlege ajavööndite teisendusi hoolikalt: olge teadlik suveajast ja ajavööndite reeglite muudatustest. Kasutage tÀpsete teisenduste tagamiseks ajakohast ajavööndite andmebaasi.
- Kasutage nanosekundite vÀÀrtuste jaoks BigInt-i: nanosekundite vÀÀrtused ĂŒletavad sageli JavaScripti numbrite maksimaalset turvalist tĂ€isarvu vÀÀrtust. Kasutage tĂ€psuse sĂ€ilitamiseks BigInt-i.
- Kaaluge polĂŒfilli kasutamist: kui peate toetama vanemaid brausereid vĂ”i keskkondi, kasutage pakki
@js-temporal/polyfill. - Testige oma koodi pÔhjalikult: testige oma koodi erinevate ajavööndite ja lokaatidega, et tagada selle korrektne toimimine kÔikide kasutajate jaoks.
- Dokumenteerige oma eeldused: dokumenteerige selgelt kÔik eeldused, mida teete ajavööndite, lokaatide vÔi kuupÀeva- ja kellaajavormingute kohta.
KokkuvÔte
Temporal.Instant pakub robustset ja tĂ€pset viisi ajahetkede esitamiseks JavaScriptis. Selle muutumatus, nanosekundi tĂ€psus ja integreeritus teiste Temporal-tĂŒĂŒpidega teevad sellest vĂ”imsa tööriista keerukate ajaarvutuste kĂ€sitlemiseks mitmesugustes rakendustes. MĂ”istes, kuidas luua, manipuleerida ja vĂ”rrelda Instant objekte ning jĂ€rgides parimaid praktikaid rahvusvahelistamise ja ajavööndite kĂ€sitlemisel, saate luua usaldusvÀÀrset ja tĂ€pset kuupĂ€eva ja kellaaja funktsionaalsust globaalsele publikule. Temporal API, sealhulgas Instant objekti omaksvĂ”tmine, vĂ”imaldab arendajatel ĂŒletada pĂ€randobjekti Date piirangud ja ehitada robustsemaid ning hooldatavamaid rakendusi, mis peegeldavad tĂ€pselt aja keerukust erinevates kultuurides ja piirkondades.
Kuna Temporal API kogub laiemat kasutust, on see valmis saama JavaScriptis kuupÀeva ja kellaaja manipuleerimise standardiks. Arendajad, kes tutvuvad selle funktsioonide ja parimate praktikatega, on hÀsti varustatud jÀrgmise pÔlvkonna ajateadlike rakenduste ehitamiseks.